import socket
import time
#连接目标
host = 'localhost'
port = 8080

#建立socket对象，基于对tcp的抽象，无需关注细节
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

#绑定，建立通信连接
s.bind((host,port))

#监听，确定连接的数量
s.listen(5)

print('starting connecting...')
con_sock, con_addr = s.accept()

#输出内容显示出粘包现象，res1接受到客户端两次发送的内容
#由于特殊的算法：将若干个数据量小、且传输到达时间间隔小的数据包，打包为一个
#需要从底层说起，send委托操作系统，将发送的数据有os拷贝到缓存中，由传输层如tcp,将数据以流的形式传输
#而recv也是委托给操作系统，os将数据从缓冲区中取出，并拷贝给recv
#由此可见recv与send并不是简单的一对一的收发关系

#由客户端引起的粘包
if False:
    res1 = con_sock.recv(1024)
    print('res1: ', res1)
    
    res2 = con_sock.recv(1024)
    print('res2: ', res2)

#由服务器引起的粘包
if False:
    res1 = con_sock.recv(1)
    print('res1: ', res1)
    time.sleep(6)
    res2 = con_sock.recv(1024)
    print('res2: ', res2)

#知道客户段发送的data，每一次接受都明确知道recv(len(data)) = 客户端每一次发送的len(data)
if True:
    res1 = con_sock.recv(5)
    print('res1: ', res1)
    time.sleep(6)
    res2 = con_sock.recv(5)
    print('res2: ', res2)
"""
#### 粘包产生的原因：
1. **发送方**：发送数据间隔时间短，数据量小，TCP协议会使用Nagle算法将多个小包合并成一个大的TCP包发送，以减少网络拥塞。
2. **接收方**：接收方应用层没有及时读取接收缓冲区中的数据，导致多个包被一次性读取。
"""